#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

zymq::MessageManager::ptr mmp;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        mmp = std::make_shared<zymq::MessageManager>("./data/message/");
        mmp->initQueueMessage("queue1");
    }
    virtual void TearDown() override
    {
        // 别清理太早，否则无法在终端查看
        // mmp->clear();
    }
};

// 恢复测试
// 此时文件中有数据，我们进行恢复测试
//  -rw-rw-r-- 1 zy zy 256 Oct 17 16:52 queue1.mqd 
// TEST(message_test, recovery_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);

//     zymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);
// }

// TEST(message_test, recovery_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
// }

// 插入测试
// TEST(message_test, insert_test)
// {
//     zymq::BasicProperties properties;
//     properties.set_id(zymq::UUIDHelper::uuid());
//     properties.set_delivery_mode(zymq::DeliveryMode::DURABLE);
//     properties.set_routing_key("news.music.pop");

//     mmp->insert("queue1", &properties, "Hello World-1", zymq::DeliveryMode::DURABLE);
//     mmp->insert("queue1", nullptr, "Hello World-2", zymq::DeliveryMode::DURABLE);
//     mmp->insert("queue1", nullptr, "Hello World-3", zymq::DeliveryMode::DURABLE);
//     mmp->insert("queue1", nullptr, "Hello World-4", zymq::DeliveryMode::DURABLE);
//     mmp->insert("queue1", nullptr, "Hello World-5", zymq::DeliveryMode::UNDURABLE);

//     ASSERT_EQ(mmp->getable_count("queue1"), 5);
//     ASSERT_EQ(mmp->total_count("queue1"), 4);    
//     ASSERT_EQ(mmp->durable_count("queue1"), 4);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 0);
// }


// 获取测试
// TEST(message_test, select_test) 
// {
//     zymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);

//     zymq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_EQ(msg2->payload().body(), std::string("Hello World-2"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 2);

//     zymq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_EQ(msg3->payload().body(), std::string("Hello World-3"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 2);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 3);

//     zymq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_EQ(msg4->payload().body(), std::string("Hello World-4"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 1);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 4);

//     zymq::MessagePtr msg5 = mmp->front("queue1");
//     ASSERT_EQ(msg5->payload().body(), std::string("Hello World-5"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 0);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 5);
// }


// 删除测试
// TEST(message_test, delete_test) 
// {
//     zymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_EQ(msg1->payload().body(), std::string("Hello World-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);
//     mmp->ack("queue1", msg1->payload().properties().id());
//     ASSERT_EQ(mmp->waitack_count("queue1"), 0);
//     ASSERT_EQ(mmp->durable_count("queue1"), 3);
//     ASSERT_EQ(mmp->total_count("queue1"), 4);
// }


//销毁测试
TEST(message_test, clear) 
{
    mmp->destroyQueueMessage("queue1");
}


int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new MessageTest);

    return RUN_ALL_TESTS();
}